/* IF2030 - Algorirma dan Struktur Data */
/* Kelas/Kelompok/Tahun  : 03/09/2011 */
/* Tanggal   : 2 Desember 2011 */
/* File      : string.c */
/* Deskripsi : Tipe bentukan string */

#include "string.h"

int strlength(char *str)
/* Menghasilkan banyak karakter yang ada pada str sampai ditemukan
   karakter '\0' untuk pertama kalinya */
{
    /* KAMUS LOKAL */
    int i = 0;

    /* ALGORITMA */
    /* Counter sampai belum ditemukan null-terminated string */
    while(*(str+i))
        i++;

    return i;
}

int strcompare(const char * str1, const char * str2)
/* Membandingkan str1 dan str2.
   Fungsi ini membandingkan karakter pertama dari str1 dan str2.
   Jika sama, akan dilanjutkan dengan membandingkan pasangan karakter berikutnya,
   sampai ditemukan karakter berbeda atau ditemukan karakter '\0'
   Menghasilkan 0, jika str1 sama dengan str2 */
{
    /* KAMUS LOKAL */
    boolean X0; /* Penanda bahwa str1 apakah sudah null-terminated string */
    boolean Y0; /* Penanda bahwa str2 apakah sudah null-terminated string */

    /* ALGORITMA */
    X0 = (*str1 == '\0');
    Y0 = (*str2 == '\0');

    if (X0 && !Y0) {
        return 1;
    } else if (!X0 && Y0) {
        return -1;
    }

    /* Pengecekan dilakukan ketika str1 dan str2 belum null-terminated string */
    while (!X0 && !Y0) {
        if ( *str1 != *str2 ) {
            return (*str1 < *str2 ) ? -1 : 1;
        }

        X0 |= (*str1 == '\0');
        Y0 |= (*str2 == '\0');

        str1++;
        str2++;
    }
    /* str1 dan str2 identik */
    return 0;
}

char *strcopy (char *destination, const char *source)
/* Menyalin source ke destination, termasuk karakter erminating null character.
   Ukuran destination harus mencukupi */
{
    /* KAMUS LOKAL */
    int i;

    /* ALGORITMA */
    i = 0;
    /* Salin sampai belum ditemukan null-terminated string pada source */
    while(*(source+i)) {
        *(destination+i) = *(source+i);
        i++;
    }
    *(destination+i) = *(source+i);
    return destination;
}

boolean isContain(char *str, char chr)
/* Menghasilkan true jika terdapat char chr dalam str */
{
    /* KAMUS LOKAL */
    int i;

    /* ALGORITMA */
    i = 0;

    /* Cari sampai ditemukan null-terminated string atau chr */
    while ((*(str+i)) && (*(str+i) !=  chr)) {
        i++;
    }

    return (*(str+i) ==  chr);
}

boolean isBlank(char *str)
/* Menghasilkan true jika karakter pertama str adalah null-terminated string */
{
    return (*str == '\0');
}

char IntToChar(int i)
/* Menghasilkan nilai char dari suatu integer 0..9 */
{
    switch (i) {
    case 0 :
        return '0';
    case 1 :
        return '1';
    case 2 :
        return '2';
    case 3 :
        return '3';
    case 4 :
        return '4';
    case 5 :
        return '5';
    case 6 :
        return '6';
    case 7 :
        return '7';
    case 8 :
        return '8';
    case 9 :
        return '9';
    default :
        return '\0';
    }
}
